package com.zijidelu.luframework.domain.repository;

import com.zijidelu.luframework.base.model.DataModel;
import com.zijidelu.luframework.domain.model.aggregate.AggregateRoot;
import com.zijidelu.luframework.domain.model.entity.Entity;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Optional;

/**
 * 聚合根仓库接口。
 *
 * @author ZIJIDELU
 * @datetime 2025/10/26 22:55
 */
public interface AggregateRepository<D extends DataModel, E extends Entity<D>, A extends AggregateRoot<D, E>> {
    /**
     * 加载聚合根。
     *
     * @param aggregateRoot 聚合根
     */
    void load(A aggregateRoot);

    /**
     * 持久化聚合根当前状态。
     *
     * @param aggregateRoot 聚合根
     */
    void persist(A aggregateRoot);

    /**
     * 批量保存聚合根及其所有子实体。
     * <p>
     * 此方法是整个聚合持久化的核心，它遵循“先根后子”的原则，并采用分组批量操作以最大化数据库性能。
     * 整个过程在单个事务中完成，确保操作的原子性。
     *
     * @param aggregateRootColl 需要保存的聚合根集合
     */
    void persistBatch(Collection<A> aggregateRootColl);

    /**
     * 根据ID加载聚合根。
     *
     * @param rootEntityId 实体ID
     * @return 聚合根
     */
    Optional<A> findById(Serializable rootEntityId);

    /**
     * 根据ID集合加载聚合根。
     *
     * @param idColl 聚合根ID集合，不能为null
     * @return 聚合根列表
     */
    List<A> findBatchById(Collection<Serializable> idColl);

    /**
     * 判断聚合根是否存在。
     *
     * @param id 聚合根ID
     * @return 如果存在则返回true，否则返回false
     */
    boolean existsById(Serializable id);

    /**
     * 根据ID删除聚合根。
     *
     * @param id 聚合根ID，不能为null
     */
    void deleteById(Serializable id);

    /**
     * 根据ID删除聚合根及其关联的子实体。
     *
     * @param id 聚合根ID，不能为null
     */
    void cascadeDeleteById(Serializable id);

    /**
     * 根据ID集合删除聚合根。
     *
     * @param idColl 聚合根ID集合，不能为null
     */
    void deleteBatchById(Collection<Serializable> idColl);

}
